//匿名内部类通常定义在外部类的方法或代码块中,且外部其它类不能访问匿名内部类
//可以访问外部类的所有成员，包括私有
//如果外部类和局部内部类成员重名，遵循就近原则,如果想访问外部类那个成员，可以使用（外部类.this.成员）去访问
//不能添加访问修饰符，但是可以用final修饰
//作用域：仅仅在定义它的方法或代码块中
public class Main {
    public static void main(String[] args) {
        Outer02 outer02 = new Outer02();
        outer02.method();

    }
}
class Outer02{
    public void method(){
        //基于接口的匿名内部类
        //1.需求：想使用IA接口并创建对象（传统方式是写一个类实现该接口，并创建类的对象。但现在我只需要使用一次，传统方法就显得累赘）
        //2.可以使用匿名内部类来简化开发
        //3.匿名内部类的名字是计算机赋予的
        //4.jdk底层在创建匿名内部类Outer02$1时，立即就创建了Outer02$1实例，并把地址返回给tiger
        //5.匿名内部类只能使用一次
        IA tiger=new IA(){
        //tiger的编译类型 ？ IA
        //tiger的运行类型 ？ Outer02$1
            @Override
            public void cry() {
                System.out.println("老虎嗷嗷叫...");
            }
        };
        System.out.println("tiger的运行类型："+tiger.getClass());
        tiger.cry();
        tiger.cry();


        //基于类的匿名内部类
        Father f=new Father("Jack"){
        //f的编译类型 ？ Father
        //f的运行类型 ？ Outer02$2

            @Override
            public void say() {
                System.out.println("匿名内部类重写了say()方法...");
            }
        };
        System.out.println("f的运行类型："+f.getClass());
        f.say();
    }

}
interface IA {
    void cry();
}
class Father{
    public Father(String name) {

    }
    public void say(){

    }
}